package war.cenario;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

import war.fase.Fase;
import war.fase.Fase1;
import war.fase.Fase2;
import war.fase.Fase3;
import war.fase.Fase4;
import war.inicio.MenuJogador;
import war.interfaces.CenarioIf;
import war.sons.Sons;
import war.telas.PainelSplash;
import war.telas.Ranking;
import war.telas.SplashFase;

/**
 * Classe que contÑ‰m a tela principal do jogo, onde objetos do tipo Fase
 * são instanciados, não onde o jogo acontece de fato
 * @author Vanderlan
 *
 */
public class Cenario extends JFrame implements ActionListener,CenarioIf {

	private Fase fase1;
	private Fase2 fase2;
	private Fase3 fase3;
	private Fase4 fase4;
	private Fase faseRemovida;
	private Timer timer;
	private double faseAtual = 1;
	private String nomeJogador;
	private String caminhoImagem;
	private boolean avancar = false;
	private JButton botaoRanking,bntZerou,bntNovo;
	private boolean gameOver = false;

	/***
	 * Construtor de cenário, que recebe por parâmetro o nome do Jogador e o caminho
	 * da imagem da sua nave
	 * @param Nome do Jogador
	 * @param Caminho da imagem do nave
	 */
	public Cenario(String nomeJogador, String caminhoImagem){

		SplashFase sp = new SplashFase(".\\images\\fases\\splashFase1.jpg");
		sp.open(1500);
		sp.close();
		setNomeJogador(nomeJogador);
		setCaminhoImagem(caminhoImagem);

		fase1 = new Fase1(0,caminhoImagem,nomeJogador);
		fase1.setSize(900,600);
		getContentPane().add(fase1);

		setTitle("War In Space");
		setSize(900,600);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

		setLayout(null);
		setResizable(false);
		setVisible(true);

		timer = new Timer(500, this);
		timer.start();
	}

	/***
	 * Implementa uma nova fase, removendo a fase atual através do método remove(Fase)
	 * Na transição de fase mostra ao usuário uma tela de Splash informando que ele estão
	 * indo para a fase 2
	 * @param Pontuação atual do Jogador, desde o inicio do jogo
	 */
	public void avancarFase2(int pontuacao){
		///AVANÐ§AR PARA FASE 2
		if(fase1.getNumeroFase() == 1 && faseAtual == 1 && fase1.getAvancar())
		{
			faseAtual = 1.5;

			final PainelSplash panel = new PainelSplash(".\\images\\fases\\splashFase2.jpg");
			panel.setBounds(0,0,getWidth(),getHeight());

			final int pontos = pontuacao;

			remove(fase1);
			repaint();

			add(panel);

			repaint();

			Thread thread = new Thread() {

				public void run() {
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					remove(panel);
					fase2 = new Fase2(pontos,caminhoImagem,getNomeJogador());
					fase2.setSize(getWidth(),getHeight());
					repaint();
					add(fase2);
					alterarFoco();
					avancar = fase2.getAvancar();
					faseAtual = 2;
				};
			};
			thread.start();
		}

	}
	/***
	 * Implementa uma nova fase, removendo a fase atual através do método remove(Fase)
	 * Na transição de fase mostra ao usuário uma tela de Splash informando que ele estão 
	 * indo para a fase 3
	 * @param Pontuação atual do Jogador, desde o inicio do jogo
	 */
	public void avancarFase3(int pontuacao){
		////AVANÐ§AR PARA FASE 3 >>>>> INCOMPLETO
		if(faseAtual == 2 && avancar)
		{
			if(fase2.getAvancar())
			{
				faseAtual = 2.5;	
				final PainelSplash panel = new PainelSplash(".\\images\\fases\\splashFase3.jpg");
				panel.setBounds(0,0,getWidth(),getHeight());

				final int pontos = pontuacao;

				remove(fase2);
				repaint();

				add(panel);

				repaint();

				Thread thread = new Thread() {
					public void run() {
						try {
							Thread.sleep(2000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						remove(panel);
						fase3 = new Fase3(pontos,caminhoImagem,getNomeJogador());
						fase3.setSize(getWidth(),getHeight());
						repaint();
						add(fase3);
						alterarFoco();
						faseAtual = 3;

					};
				};
				thread.start();
			}
		}


	}	
	/***
	 * Implementa uma nova fase, removendo a fase atual atravÑ‰s do mÑ‰todo remove(Fase)
	 * Na transiÑ‡Ñƒo de fase mostra ao usuário uma tela de Splash informando que ele estão
	 * indo para a fase 4
	 * @param Pontuação atual do Jogador, desde o inicio do jogo
	 */
	public void avancarFase4(int pontuacao){
		if(faseAtual == 3 && avancar)
		{

			faseAtual = 3.5;	
			final PainelSplash panel = new PainelSplash(".\\images\\fases\\splashFase4.jpg");
			panel.setBounds(0,0,getWidth(),getHeight());

			final int pontos = pontuacao;

			remove(fase3);
			repaint();

			add(panel);

			repaint();

			Thread thread = new Thread() {
				public void run() {
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					remove(panel);
					fase4 = new Fase4(pontos,caminhoImagem,getNomeJogador());
					fase4.setSize(getWidth(),getHeight());
					repaint();
					add(fase4);
					alterarFoco();
					faseAtual = 4;

				};
			};
			thread.start();
		}

	}
	/***
	 * Esse mÑ‰todo Ñ‰ chamado quando o jogador vence todas as fases
	 * mostra uma tela de ParabÑ‰ns ao jogador e trÑ�s a opÑ‡Ñƒo de comeÑ‡ar
	 * um novo jogo e de ver o Ranking
	 * @param PontuaÑ‡Ñƒo atual do Jogador, desde o inicio do jogo
	 */
	public void fimDejogo(int pontuacao) {

		final PainelSplash painel = new PainelSplash(".\\images\\fases\\zerou.jpg");
		painel.setBounds(0,0,getWidth(),getHeight());
		bntZerou = new JButton("Veja o Ranking");
		bntZerou.setBounds(550,370,140,40);
		bntZerou.addActionListener(this);

		
		final int pontos = pontuacao;
		final JLabel labelPontos = new JLabel("Sua pontuacao foi: " +pontos);
		labelPontos.setBounds(440,270,180,30);

		repaint();

		Thread thread = new Thread() {
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				remove(fase4);
				repaint();
				add(bntZerou);
				add(labelPontos);
				add(painel);
				repaint();
			};
		};
		thread.start();	
	}
	/***
	 * MÑ‰todo que Ñ‰ chamado quando o jogador perde o Jogo ou seja GAME OVER
	 * mostra para o jogador as opÑ‡Ñ•es de ver o ranking ou tentar novamente
	 * recebe por parÑ‚metro a Fase atual em que o jogador se encontra, para assim
	 * poder chamar o mÑ‰todo remove(Fase), para depois mostrar a tela de Game Over
	 * @param Fase em que o jogador se encontra atualmente
	 */
	public void fimDeJogoOver(final Fase faseRemovida) {
		
		final PainelSplash painel = new PainelSplash(".\\images\\fases\\gameOver.jpg");
		painel.setBounds(-1,-1,getWidth(),getHeight());
		botaoRanking = new JButton("Veja o Ranking");
		botaoRanking.setBounds(300,520,140,40);
		botaoRanking.addActionListener(this);
		
		bntNovo = new JButton("Tentar Novamente");
		bntNovo.setBounds(460,520,140,40);
		bntNovo.addActionListener(this);
		
		final int pontos = faseRemovida.getPontuacao();
		
		Font fonte = new Font("Arial",Font.BOLD,47);
		final JLabel labelPontos = new JLabel(""+pontos);
		labelPontos.setFont(fonte);
		labelPontos.setForeground(new Color(255,255,255));
		
		labelPontos.setBounds(500,290,250,40);

		repaint();

		Thread thread = new Thread() {
			public void run() {
				try {
					Thread.sleep(300);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				remove(faseRemovida);
				repaint();
				add(botaoRanking);
				add(labelPontos);
				add(bntNovo);
				add(painel);
				repaint();
				Sons.gameOver();
			};
		};
		thread.start();	
	}
	
	
	
	/**
	 * MÑ‰todo utilizado para trazer o Foco ao novo JPanel que Ñ‰ adicionado quando
	 * o jogador passa de fase.
	 */
	private void alterarFoco() {
		setVisible(false);
		setVisible(true);
	}

	public Fase getFase() {
		return fase1;
	}

	public Timer getTimer() {
		return timer;
	}

	public void setTimer(Timer timer) {
		this.timer = timer;
	}

	public double getFaseAtual() {
		return faseAtual;
	}

	public void setFaseAtual(int faseAtual) {
		this.faseAtual = faseAtual;
	}

	public void setFase(Fase fase) {
		this.fase1 = fase;
	}

	public void setFase(Fase1 fase) {
		this.fase1 = fase;
	}

	public String getNomeJogador() {
		return nomeJogador;
	}
	public void setNomeJogador(String nomeJogador) {
		this.nomeJogador = nomeJogador;
	}

	public String getCaminhoImagem() {
		return caminhoImagem;
	}

	public void setCaminhoImagem(String caminhoImagem) {
		this.caminhoImagem = caminhoImagem;
	}
	@Override
	public void actionPerformed(ActionEvent e) {

		if(faseAtual == 1 && fase1.getAvancar()) {
			avancarFase2(fase1.getPontuacao());

		}
		if(faseAtual == 2){
			avancar = fase2.getAvancar();
			if(avancar) 
			{
				avancarFase3(fase2.getPontuacao());
			}

		}
		if(faseAtual == 3) {
			if(fase3.getAvancar()) 
			{
				avancarFase4(fase3.getPontuacao());
			}
		}
		if(faseAtual == 4) {
			if(fase4.getAvancar()) 
			{
				fimDejogo(fase4.getPontuacao());
				Sons.pararMusica();
				faseAtual = 0;
				Sons.musicaVitoria();
			}
		}
		if(e.getSource() == botaoRanking){
			
			dispose();
			Ranking r = new Ranking();
			r.inicializar();
		}
		if(e.getSource() == bntZerou){
			
			dispose();
			Ranking r = new Ranking();
			r.inicializar();
			Sons.pararMusicaVitoria();
		}
		if(e.getSource() == bntNovo){
			MenuJogador m = new MenuJogador();
			dispose();
		}
		///
		if(faseAtual == 1){
			gameOver = fase1.getGameOver();
			faseRemovida = fase1;
		}
		if(faseAtual == 2){
			gameOver = fase2.getGameOver();
			faseRemovida = fase2;
		}
		if(faseAtual == 3){
			gameOver = fase3.getGameOver();
			faseRemovida = fase3;
		}
		if(faseAtual == 4){
			gameOver = fase4.getGameOver();
			faseRemovida = fase4;
		}
		if(gameOver == true && faseAtual != 30.0){
			fimDeJogoOver(faseRemovida);
			gameOver = false;
			faseAtual = 30.0;
		}
		
	}
}